package com.unknowpupil.design.factory;

import com.unknowpupil.design.factory.BMW;
import com.unknowpupil.design.factory.BYD;
import com.unknowpupil.design.factory.Car;
import com.unknowpupil.design.factory.abstractf.CarAbstractFactory;
import com.unknowpupil.design.factory.abstractf.Engine;
import com.unknowpupil.design.factory.abstractf.LuxuryCarAbstractFactory;
import com.unknowpupil.design.factory.abstractf.Seat;
import com.unknowpupil.design.factory.abstractf.Tyre;
import com.unknowpupil.design.factory.method.BMWFactory;
import com.unknowpupil.design.factory.method.BYDFactory;
import com.unknowpupil.design.factory.method.BenzFactory;
import com.unknowpupil.design.factory.method.CarMethodFactor;
import com.unknowpupil.design.factory.simple.CarSimpleFactory;

/**
 * @Description: <br/>
 * <p>
 *      工厂模式  无需更子类打交道。
 *
 *      结构比较：
 *
 *      代码复杂度：
 *
 *      管理复杂度：
 *
 *      简单工厂完爆 方法工厂。 方法工厂模式类变多了，有冗余。
 *
 * </p>
 * @Author: <a> w10g </a>
 * @CreateDate: Create in 2020/4/24 19:06
 * @Classname: People
 * @Version: 1.0
 */

public class People {
    public static void main(String[] args) {

        /**
         * 没工厂
         */
//        Car bmw = new BMW();
//        Car byd = new BYD();

        /**
         * 简单工厂  整体关系赋值，调用者简单。
         * 新增加车型的时候需要修改业务代码。 代码有侵入性
         */
//        Car byd = CarSimpleFactory.createCar("BYD");
//        Car bmw = CarSimpleFactory.createCar("BMW");

        /**
         * 方法工厂模式
         * 增加新车型时候无需修改其他代码。只需要建立Benz对象，和BenzFactory类继承CarFactory即可。
         * 不用修改 业务代码 代码无侵入性
         */

//        Car bmw = new BMWFactory().createCar();
//        Car byd = new BYDFactory().createCar();
//        Car benz = new BenzFactory().createCar();

//        bmw.start();
//        byd.start();
//        benz.start();

        /**
         * 抽象工厂模式，创建产品族。
         */
        CarAbstractFactory factory = new  LuxuryCarAbstractFactory();
        Engine engine = factory.createEngine();
        Seat seat = factory.createSeat();
        Tyre tyre = factory.createTyre();
        engine.run();
        seat.function();
        tyre.merit();
    }
}
